package com.gzhu.knowledgeAdmin.service;



import com.gzhu.knowledgeAdmin.common.result.TreeNode;
import com.gzhu.knowledgeAdmin.entity.Flow;
import com.gzhu.knowledgeAdmin.entity.Template;

import java.util.HashMap;
import java.util.List;

public interface FlowService {

    /**
     * 获取回答的所有类型
     * @return list
     */
    List<String> getAnswerType();

    /**
     * 根据templateId获取对应的流程flow
     * @param templateId
     * @return
     */
    List<Flow> getFlowByTemplateId(int templateId);

    /**
     * 根据templateId,回答类型,获取下一个话术的id
     * @param templateId 话术模板id
     * @param answerType 回答类型
     * @return 下一个话术的id
     */
    int getTargetId(int templateId,String answerType);

    /**
     * 根据templateId,获取到该id下已经存在的answer类型
     * @param templateId templateId
     * @return list
     */
    List<String> getHasAnswerTypeById(int templateId);

    /**
     * 当插入话术在两个话术中间时,后面flow的逻辑顺序修改
     * @param name
     * @param afterId
     * @return
     */
    int UpdateLogicOrderOnInsertBW(String name,int afterId);

    /**
     * 根据name,和id,获取到该话术和根在该话术后的节点的id
     * @param name
     * @param MyId
     * @return
     */
    List<Integer> getMeAndChildTemplateId(String name,int MyId);

    /**
     * 根据flowList,得出templateId和target的一个映射关系,一个templateId可能对应多个target
     * @param flowList
     * @return
     */
    HashMap<Integer, List<Integer>> getIdAndTargetMapByFlowList(List<Flow> flowList);

    /**
     * 根据id,获取到该id和该id后的结点
     * @param root
     * @param id
     * @return 返回节点集合
     */
    List<Integer> getChildrenById(TreeNode root, int id);

    /**
     * 根据起始id,和templateId和answer_target的map,构造出树形结构,不填充template数据
     * @param rootId
     * @param map
     * @return
     */
    TreeNode buildTree(int rootId, HashMap<Integer, List<Integer>> map);

    /**
     * 根据起始id,和templateId和answer_target的map,和template对应的数据map,flow对应的数据map,构造出树形结构,并填充template数据
     * @param rootId 根id
     * @param map id和该id对应子节点的list
     * @param allTemplateMap id和对应tamplate的信息
     * @param flowList 所有的flow
     * @return
     */
    TreeNode buildTree(int rootId, HashMap<Integer, List<Integer>> map, HashMap<Integer, Template> allTemplateMap, List<Flow> flowList);
}
